/* encoder_system.h */
#ifndef ENCODER_KNOBS_H
#define ENCODER_KNOBS_H

#include <stdint.h>
#include <stdbool.h>

#define MAX_ENTITIES       8
#define EVENT_QUEUE_SIZE   16
#define ACCEL_SAMPLE_MS    50
#define LOW_POWER_INTERVAL 100

// 事件类型定义
typedef enum {
    EVT_ROTATION_CW,       // 顺时针旋转
    EVT_ROTATION_CCW,      // 逆时针旋转
    EVT_BUTTON_SHORT,      // 短按
    EVT_BUTTON_LONG,       // 长按
    EVT_BUTTON_DOUBLE,     // 双击
    EVT_ACCELERATION_START,// 开始加速
    EVT_ACCELERATION_END   // 结束加速
} EncoderEventType;

// 回调函数类型
typedef void (*EncoderCallback)(uint8_t entity_id, EncoderEventType type, int16_t value);

// 实体配置参数
typedef struct {
    uint8_t pin_a;          // A相引脚
    uint8_t pin_b;          // B相引脚
    uint8_t pin_btn;        // 按钮引脚
    bool active_level;      // 有效电平
    uint16_t debounce_ms;   // 消抖时间
    uint16_t longpress_ms;  // 长按时间
    uint16_t doubleclick_ms;// 双击时间窗口
    uint16_t accel_threshold;// 加速度阈值(pulses/sec)
} EncoderConfig;

typedef struct {
    EncoderConfig config;
    
    // 编码器状态
    struct {
        uint8_t last_a : 1;
        uint8_t last_b : 1;
        uint8_t btn_state : 2;
    } state;
    // 时间追踪
    uint32_t last_poll;
    uint32_t btn_down_time;
    uint32_t accel_sample_time;
    // 动态参数
    struct {
        uint16_t poll_interval;
        float rotation_speed;
        bool accel_active;
    } dynamic;
    EncoderCallback callback;
    void* context;
} EncoderEntity;

typedef struct {
    EncoderEntity entities[MAX_ENTITIES];
    uint8_t count;
    bool low_power;
    uint32_t (*get_tick)(void);
} EncoderSystem;

// 系统初始化
void encoder_system_init(uint32_t (*get_tick_fn)(void));

// 注册编码器实体
uint8_t encoder_register(const EncoderConfig *config, EncoderCallback callback);

// 启动处理线程
void encoder_start_threads(void);

#endif
